#include "rest.h"
#include "ui_rest.h"

rest::rest(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::rest)
{
    ui->setupUi(this);
    QString heroName = "法外狂徒";
    // 在构造函数中添加表格选择模式设置（确保正确的选择模式）
    ui->tableWidget->setSelectionMode(QAbstractItemView::SingleSelection);
    ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); // 整行选择
    ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); // 禁止直接编辑单元格

    connect(ui->pushButton_3, &QPushButton::clicked, this, &rest::showPage2);
    connect(ui->pushButton,&QPushButton::clicked,this,[=]{emit showPage3();});

    sqlOr = new SqlOperator();


    // 创建按钮并设置为独立控件
    createIndependentButtons();

    // 初始加载数据
    loadTableData();

    // 连接查询按钮信号槽
    connect(queryBtn, &QPushButton::clicked, this, &rest::onQueryButtonClicked);
    connect(del,&QPushButton::clicked,this,&rest::save);
    connect(change,&QPushButton::clicked,this,[=]()
    {
        rest::changed();
        select_gear_name(heroName);
    });

}

rest::~rest()
{
    delete ui;
}


void rest::select_gear_name(const QString &heroName)
{
    // 查询hero表中对应英雄的五个slot值
    QHash<QString, QVariant> whereConditions;
    whereConditions.insert("hero_name", heroName);
    QList<QString> fields = {"slot_head", "slot_chest", "slot_leg", "slot_foot", "slot_weapon"};
    QList<QVariantList> heroData;
    if (!sqlOr->selectData("hero", fields, whereConditions, heroData) || heroData.isEmpty()) {
        qDebug() << "查询英雄装备槽数据失败：" << sqlOr->lastError();
        return;
    }

    // 存储每个部位对应的gear_id（key为部位名称，value为gear表中的id）
    QHash<QString, QString> slotGearData;
    // 部位名称与字段顺序对应
    QStringList slotNames = {"头部", "胸部", "腿部", "脚部", "武器"};

    for (int i = 0; i < fields.size(); ++i) {
        int gearId = heroData.first().at(i).toInt();
        if (gearId > 0) {
            // 查询gear表中对应id的gear_value
            QHash<QString, QVariant> gearConditions;
            gearConditions.insert("gear_id", gearId);
            QList<QVariantList> gearData;
            if (sqlOr->selectData("gear", {"gear_name"}, gearConditions, gearData) && !gearData.isEmpty()) {
                QString gearValue = gearData.first().at(0).toString();
                slotGearData.insert(slotNames[i], gearValue);
            } else {
                qDebug() << "查询装备值失败，装备ID：" << gearId;
                slotGearData.insert(slotNames[i], 0); // 未查询到值时设为0
            }
        } else {
            slotGearData.insert(slotNames[i], 0); // 无装备时设为0
        }
    }

    // 用成员变量存储查询到的装备值数据（key：部位名称，value：装备值）
    m_slotGearData = slotGearData;

    // 可根据需要添加UI更新逻辑，例如：
     ui->head->setText(QString("头部: %1").arg(m_slotGearData["头部"]));
     ui->chest->setText(QString("胸部: %1").arg(m_slotGearData["胸部"]));
     ui->leg->setText(QString("腿部: %1").arg(m_slotGearData["腿部"]));
     ui->foot->setText(QString("脚部: %1").arg(m_slotGearData["脚部"]));
     ui->weapon->setText(QString("武器: %1").arg(m_slotGearData["武器"]));
}


// 创建独立于表格的按钮
void rest::createIndependentButtons()
{
    // 查询按钮 - 位置(x=20, y=20)，大小(100×40)
    queryBtn = new QPushButton("查询", this);
    queryBtn->setObjectName("queryButton");
    queryBtn->setGeometry(100, 260, 100, 40);

    // 更换装备按钮 - 位置(x=140, y=20)，大小(100×40)
    change = new QPushButton("更换装备", this);
    change->setObjectName("change");
    change->setGeometry(200, 260, 100, 40);

    // 丢弃装备按钮 - 位置(x=260, y=20)，大小(100×40)
    del = new QPushButton("丢弃装备", this);
    del->setObjectName("del");
    del->setGeometry(300, 260, 100, 40);
}

// 加载表格数据
void rest::loadTableData()
{
    if (!sqlOr->open("./pro.db", "connectionName")) {
        qDebug() << "数据库连接失败：" << sqlOr->lastError();
        return;
    }
    QString tableName = "pack";
    QList<QString> fields;
    fields << "gear_id" << "gear_name" << "gear_value";
    QList<QVariantList> resultData;

    if (sqlOr->selectData(tableName, fields, resultData)) {
        // 清空表格现有数据
        ui->tableWidget->clearContents();
        while (ui->tableWidget->rowCount() > 0) {
            ui->tableWidget->removeRow(0);
        }

        // 设置表格列数和表头
        ui->tableWidget->setColumnCount(3);
        QStringList headers;
        headers << "id" << "装备" << "数值";
        ui->tableWidget->setHorizontalHeaderLabels(headers);

        // 填充数据
        for (int row = 0; row < resultData.size(); ++row) {
            ui->tableWidget->insertRow(row);
            const QVariantList &rowData = resultData[row];
            for (int col = 0; col < rowData.size(); ++col) {
                QTableWidgetItem *item = new QTableWidgetItem(rowData[col].toString());
                ui->tableWidget->setItem(row, col, item);
            }
        }
    } else {
        qDebug() << "查询失败：" << sqlOr->lastError();
    }
}

void rest::updateTableData()
{
    QString gear_name;

    QString sql = QString("select gear_slot_id from pack where gear_name = '%1'").arg(gear_name);

}
void rest::onQueryButtonClicked()
{
    // 重新加载数据，实现表格更新
    loadTableData();

    // 可以在这里添加提示信息
    qDebug() << "表格数据已更新";
}

// 备用按钮1的槽函数（示例）
void rest::onSpareButton1Clicked()
{
    // 获取选中的行
    int selectedRow = ui->tableWidget->currentRow();
    if (selectedRow >= 0) {
        // 处理选中行的数据
        QTableWidgetItem *idItem = ui->tableWidget->item(selectedRow, 0);
        if (idItem) {
            qDebug() << "选中的ID: " << idItem->text();
            // 可以根据选中的ID执行相应操作
        }
    } else {
        qDebug() << "请先选择一行数据";
    }
}

void rest::save()
{
    // 检查数据库连接
    if (!sqlOr->open("./pro.db", "connectionName")) {
        qDebug() << "数据库连接失败：" << sqlOr->lastError();
        QMessageBox::critical(this, "连接错误", "数据库连接失败：" + sqlOr->lastError());
        return;
    }

    // 验证数据库连接是否有效
    QSqlDatabase db = QSqlDatabase::database("connectionName");
    if (!db.isValid() || !db.isOpen()) {
        qDebug() << "数据库连接无效或未打开";
        QMessageBox::critical(this, "连接错误", "数据库连接无效或未打开");
        return;
    }

    // 获取当前选中的项目
    QModelIndexList selection = ui->tableWidget->selectionModel()->selectedRows();
    if (selection.isEmpty()) {
        QMessageBox::warning(this, "选择提示", "请先选中要删除的行");
        sqlOr->close();
        return;
    }

    // 获取选中行的索引（使用模型索引而非视觉索引）
    int selectedRow = selection.first().row();

    qDebug() << "当前选中行索引：" << selectedRow;

    // 检查表格是否有足够的行
    if (selectedRow >= ui->tableWidget->rowCount()) {
        qDebug() << "选中行索引超出表格行数范围";
        QMessageBox::warning(this, "错误", "选中的行不存在");
        sqlOr->close();
        return;
    }

    // 获取该行对应的数据库 id（第一列）
    QTableWidgetItem *idItem = ui->tableWidget->item(selectedRow, 0);
    if (!idItem) {
        qDebug() << "无法获取选中行的ID单元格";
        QMessageBox::warning(this, "错误", "无法获取行ID信息");
        sqlOr->close();
        return;
    }

    // 检查ID是否为空
    QString idText = idItem->text().trimmed();
    qDebug() << idText;
    if (idText.isEmpty()) {
        qDebug() << "选中行的ID为空";
        QMessageBox::warning(this, "错误", "ID不能为空");
        sqlOr->close();
        return;
    }

    // 转换ID为整数
    bool conversionOk;
    int id = idText.toInt(&conversionOk);
    if (!conversionOk || id <= 0) {
        qDebug() << "ID转换失败，值为：" << idText;
        QMessageBox::warning(this, "错误", "ID格式无效：" + idText);
        sqlOr->close();
        return;
    }
    qDebug() << "要删除的记录ID：" << id;

    // 执行数据库删除操作
    QSqlQuery query(db);
    query.prepare("DELETE FROM pack WHERE gear_id = :id");
    query.bindValue(":id", id);

    if (query.exec()) {
        // 检查是否有记录被影响
        if (query.numRowsAffected() <= 0) {
            qDebug() << "未找到ID为" << id << "的记录或删除未生效";
            QMessageBox::information(this, "提示", "未找到对应记录或无需删除");
            sqlOr->close();
            return;
        }

        // 关键修复：使用模型索引进行删除
        // 先保存要删除的ID，再执行删除
        ui->tableWidget->blockSignals(true); // 临时阻止信号，避免索引混乱
        ui->tableWidget->removeRow(selectedRow);
        ui->tableWidget->blockSignals(false);

        // 清除选择
        ui->tableWidget->clearSelection();

        QMessageBox::information(this, "成功", "数据删除成功");
        qDebug() << "ID为" << id << "的记录删除成功";
    } else {
        qDebug() << "数据库删除失败：" << query.lastError().text();
        QMessageBox::critical(this, "错误", "数据库删除失败：" + query.lastError().text());
    }

    // 关闭数据库连接
    //sqlOr->close();
}

void rest::changed()
{
    // 检查数据库连接
    if (!sqlOr->open("./pro.db", "connectionName")) {
        qDebug() << "数据库连接失败：" << sqlOr->lastError();
        QMessageBox::critical(this, "连接错误", "数据库连接失败：" + sqlOr->lastError());
        return;
    }

    // 验证数据库连接是否有效
    QSqlDatabase db = QSqlDatabase::database("connectionName");
    if (!db.isValid() || !db.isOpen()) {
        qDebug() << "数据库连接无效或未打开";
        QMessageBox::critical(this, "连接错误", "数据库连接无效或未打开");
        return;
    }

    // 获取当前选中的项目
    QModelIndexList selection = ui->tableWidget->selectionModel()->selectedRows();
    if (selection.isEmpty()) {
        QMessageBox::warning(this, "选择提示", "请先选中要操作的行");
        sqlOr->close();
        return;
    }

    // 获取选中行的索引
    int selectedRow = selection.first().row();

    // 检查表格是否有足够的行
    if (selectedRow >= ui->tableWidget->rowCount()) {
        qDebug() << "选中行索引超出表格行数范围";
        QMessageBox::warning(this, "错误", "选中的行不存在");
        sqlOr->close();
        return;
    }

    // 获取该行对应的装备名称（假设装备列是第3列，索引为2）
    QTableWidgetItem *gearNameItem = ui->tableWidget->item(selectedRow, 1);
    if (!gearNameItem) {
        qDebug() << "无法获取选中行的装备名称单元格";
        QMessageBox::warning(this, "错误", "无法获取装备名称信息");
        sqlOr->close();
        return;
    }

    // 检查装备名称是否为空
    QString gearName = gearNameItem->text().trimmed();
    if (gearName.isEmpty()) {
        qDebug() << "选中行的装备名称为空";
        QMessageBox::warning(this, "错误", "装备名称不能为空");
        sqlOr->close();
        return;
    }
    qDebug() << "要查询的装备名称：" << gearName;

    // 从gear表查询对应的gear_id和gear_slot_id
    QSqlQuery query(db);
    query.prepare("SELECT gear_id, gear_slot_id FROM gear WHERE gear_name = :gearName");
    query.bindValue(":gearName", gearName);

    if (!query.exec()) {
        qDebug() << "查询装备信息失败：" << query.lastError().text();
        QMessageBox::critical(this, "错误", "查询装备信息失败：" + query.lastError().text());
        sqlOr->close();
        return;
    }

    // 检查是否查询到结果
    if (!query.next()) {
        qDebug() << "未找到装备名称为" << gearName << "的记录";
        QMessageBox::information(this, "提示", "未找到对应装备记录");
        sqlOr->close();
        return;
    }

    // 获取查询结果
    int gearId = query.value("gear_id").toInt();
    int gearSlotId = query.value("gear_slot_id").toInt();
    qDebug() << "查询到装备ID：" << gearId << "，装备槽ID：" << gearSlotId;

    // 根据gear_slot_id确定要更新的hero表字段
    QString heroSlotField;
    switch (gearSlotId) {
        case 1: heroSlotField = "slot_head";
            break;      // 头部
        case 2: heroSlotField = "slot_chest";
            break;     // 胸部
        case 3: heroSlotField = "slot_leg";
            break;       // 腿部
        case 4: heroSlotField = "slot_foot";
            break;      // 脚部
        case 5: heroSlotField = "slot_weapon";
            break;    // 武器
        default:
            qDebug() << "无效的装备槽ID：" << gearSlotId;
            QMessageBox::warning(this, "错误", "无效的装备槽ID");
            sqlOr->close();
            return;
    }

    // 这里假设要更新的是ID为1的英雄，实际应用中可能需要动态指定英雄ID
    int heroId = 1;

    // 执行更新hero表的操作
    query.prepare(QString("UPDATE hero SET %1 = :gearId WHERE id = :heroId").arg(heroSlotField));
    query.bindValue(":gearId", gearId);
    query.bindValue(":heroId", heroId);

    if (query.exec()) {
        if (query.numRowsAffected() > 0) {
            QMessageBox::information(this, "成功", "装备已成功分配给英雄");
            qDebug() << "英雄ID" << heroId << "的" << heroSlotField << "已更新为装备ID" << gearId;
        } else {
            QMessageBox::information(this, "提示", "未找到对应英雄记录或无需更新");
            qDebug() << "未找到英雄ID为" << heroId << "的记录或无需更新";
        }
    } else {
        qDebug() << "更新英雄装备失败：" << query.lastError().text();
        QMessageBox::critical(this, "错误", "更新英雄装备失败：" + query.lastError().text());
    }

    // 关闭数据库连接
    //sqlOr->close();
}



